/**
***************************************************
*@file  protect.h
*@brief protect.h
*@author 花满楼
*@date     2020-7-4
*@version  V1
*@note 系统保护的定义
***************************************************
*/
#ifndef __PROTECT_H
#define __PROTECT_H
#include "sys.h"


#define Cell_OVP_Th                     4250    ///<电芯过压保护阈值4250mV
#define Cell_OVPRecover_Th              4000    ///<电芯过压保护释放阈值
#define Cell_OVA_Th                     4230    ///<电芯过压告警阈值4230mV
#define Cell_OVARecover_Th              4000    ///<电芯过压告警释放阈值

#define Cell_UVP_Th                     2500    ///<电芯欠压保护阈值
#define Cell_UVPRecover_Th              3000    ///<电芯欠压保护释放阈值
#define Cell_UVA_Th                     2800    ///<电芯欠压告警阈值
#define Cell_UVARecover_Th              3000    ///<电芯欠压告警释放阈值

#define Dischar_OTP_Th                  115     ///<电芯过温保护阈值，-40℃的偏移
#define Dischar_OTPRecover_Th           100     ///<电芯过温保护释放阈值，-40℃的偏移
#define Dischar_OTA_Th                  110     ///<电芯过温告警阈值，-40℃的偏移
#define Dischar_OTARecover_Th           100     ///<电芯过温告警释放阈值，-40℃的偏移

#define Dischar_UTP_Th                  20      ///<电芯过温保护阈值，-40℃的偏移
#define Dischar_UTPRecover_Th           28      ///<电芯过温保护释放阈值，-40℃的偏移
#define Dischar_UTA_Th                  25      ///<电芯过温告警阈值，-40℃的偏移
#define Dischar_UTARecover_Th           28      ///<电芯过温告警释放阈值，-40℃的偏移

#define Charge_OTP_Th                   105     ///<充电过温保护阈值，-40℃偏移
#define Charge_OTPRecover_Th            95      ///<充电过温保护释放阈值，-40℃偏移
#define Charge_OTA_Th                   100     ///<充电过温告警阈值，-40℃偏移
#define Charge_OTARecover_Th            95      ///<充电过温告警释放阈值，-40℃偏移

#define Charge_UTP_Th                   35      ///<充电过温保护阈值，-40℃偏移
#define Charge_UTPRecover_Th            40      ///<充电过温保护释放阈值，-40℃偏移
#define Charge_UTA_Th                   37      ///<充电过温告警阈值，-40℃偏移
#define Charge_UTARecover_Th            40      ///<充电过温告警释放阈值，-40℃偏移

#define Cell_Char_OCP_Th                75      ///<充电过流保护阈值，2.5Ah*3*1C 默认放电10倍
#define Cell_Char_OCA_Th                67.5f   ///<充电过流告警阈值，2.5Ah*3*0.9C 默认放电10倍

#define Cell_Dischar_OCP_Th             -1000   ///<放电过流保护阈值    默认放电10倍
#define Cell_Dischar_OCA_Th             -800    ///<放电过流告警阈值    默认放电10倍

#define Bat_OVP_Th                      2295    ///<总压过高保护阈值    默认放电10倍
#define Bat_OVPRecover_Th               2160    ///<总压过高保护释放阈值  默认放电10倍
#define Bat_OVA_Th                      2284    ///<总压过高告警阈值    默认放电10倍
#define Bat_OVARecover_Th               2160    ///<总压过高告警释放    默认放电10倍

#define Bat_UVP_Th                      1350    ///<总压过低保护阈值    默认放电10倍
#define Bat_UVPRecover_Th               1620    ///<总压过低保护释放阈值  默认放电10倍
#define Bat_UVA_Th                      1511    ///<总压过低告警阈值    默认放电10倍
#define Bat_UVARecover_Th               1620    ///<总压过低告警释放    默认放电10倍

#define DVP_Th                          500     ///<电芯压差过大保护阈值
#define DVPRecover_Th                   200     ///<电芯压差过大保护释放阈值
#define DVA_Th                          300     ///<电芯压差过大告警阈值
#define DVARecover_Th                   200     ///<电芯压差过大告警释放阈值

#define DTP_Th                          15      ///<电芯温差过大保护阈值
#define DTPRecover_Th                   5       ///<电芯温差过大保护释放阈值
#define DTA_Th                          10      ///<电芯温差过大告警阈值
#define DTARecover_Th                   5       ///<电芯温差过大告警释放阈值

#define Charge_OTP_Th                   105     ///<充电过温保护阈值，-40℃偏移
#define Charge_OTPRecover_Th            95      ///<充电过温保护释放阈值，-40℃偏移
#define Charge_OTA_Th                   100     ///<充电过温告警阈值，-40℃偏移
#define Charge_OTARecover_Th            95      ///<充电过温告警释放阈值，-40℃偏移


/**<不知道为何没有释放阈值*/
#define SYS_DVP_Th                      30     	///<并机系统压差过大保护阈值 30V
#define SYS_DVA_Th                      8       ///<并机系统压差过大告警阈值 8V


#define CELL_VOL_LOSE                   100     ///<电芯采样电压低于100mV，表示电芯采集开路
#define Cell_TEMH_LOSE                  200     ///<电芯温度超过160℃，认为温度断线，偏移-40
#define Cell_TEML_LOSE                  5               ///<电芯温度低于-35℃，认为温度断线，偏移-40
	
#define MAX_CHARGE_VOL                  2700    ///<最大充电电压，按照单电芯电压不超过4.5V，60串计算，放大10倍
#define FAIL_CONNECT_TH                 940     ///<负载动力线反接保护阈值，94V，放大10倍


/**
  * @brief  故障等级
*/
typedef enum
{
    NO_FAULT          = 0,
    SLIGHT_FAULT      = 1,
    SERIOUS_FAULT     = 2
} Fault_Lever;
/**@} */

/**
  * @brief  维谛保护寄存器
*/
typedef struct _Alarm_Register_Group
{
    union
    {
        struct
        {
            u16 Bat_OV          : 1; //电池总压过高，0：正常；1：异常
            u16 Bat_UV          : 1; //电池总压过低
            u16 Cell_OV         : 1; //电芯单体电压过高
            u16 Cell_UV         : 1; //电芯单体电压过低
            u16 Cell_OT         : 1; //电芯单体温度过高
            u16 Cell_UT         : 1; //电芯电芯温度过低
            u16 Char_OC         : 1; //电池充电电流过大
            u16 Dischar_OC  	: 1; //电池放电电流过大
            u16 Insul_Res       : 1; //绝缘阻抗过低
            u16 Dif_Vol         : 1; //电池压差过大
            u16 Cell_Fail       : 1; //电芯失效告警
            u16 Other_Alarm 	: 1; //电池其他轻微故障
            u16 RSVD            : 4; //保留
        } Bit;
        u16 Word;
    } Slight_Alarm1;

    union
    {
        struct
        {
            u16 RSVD                : 16; //保留
        } Bit;
        u16 Word;
    } Slight_Alarm2;

    union
    {
        struct
        {
            u16 Bat_OV              : 1; //电池总压过高，0：正常；1：异常
            u16 Bat_UV              : 1; //电池总压过低
            u16 Cell_OV             : 1; //电芯单体电压过高
            u16 Cell_UV             : 1; //电芯单体电压过低
            u16 Cell_OT             : 1; //电芯单体温度过高
            u16 Cell_UT             : 1; //电芯单体温度过低
            u16 Char_OC             : 1; //电池充电电流过大
            u16 Dischar_OC     		: 1; //电池放电电流过大
            u16 Insul_Res           : 1; //绝缘阻抗过低
            u16 Cell_Dif_Vol    	: 1; //电芯压差过大
            u16 Cell_Fail           : 1; //电芯失效告警
            u16 Vol_Sam_Fail    	: 1; //电压采集失效
            u16 Cur_Sam_Fail    	: 1; //电流采集失效
            u16 Tem_Sam_Fail    	: 1; //温度采集失效
            u16 Bat_Adr_Conf    	: 1; //电池地址冲突
            u16 Bat_Adr_Fail    	: 1; //电池地址设置错误
        } Bit;
        u16 Word;
    } Serious_Alarm1;

    union
    {
        struct
        {
            u16 Bat_Dif_Vol         : 1; //并机电池压差过大，0：正常；1：异常
            u16 Bat_Connect_Err     : 1; //电池接口接反
            u16 Relay_Fail          : 1; //继电器失效
            u16 Cell_Dif_Temp       : 1; //温差过大（应该是电池模组之间）
            u16 Power_Cable_Abno    : 1; //输出功率线缆异常
            u16 Bat_Swith_Fail      : 1; //空开异常
            u16 Other_Fail          : 1; //电池模组其他严重故障
			/*
			*以下部分维谛为保留部分，我个人为调试方便作出修正，但并未通过485传输
			*/
			u16 Bq_Ctl_Fail			: 1; //BQ79616配置失败
			u16 Bq_OV				: 1; //BQ79616过压故障
			u16 Bq_UV				: 1; //BQ79616欠压故障
			u16 Bq_OT				: 1; //BQ79616过温故障
			u16 Bq_UT				: 1; //BQ79616低温故障
			u16 Bq_VC_Open			: 1; //BQ79616的VC开路
			u16 Bq_VCCB_Fail		: 1; //BQ79616的VC和CB检测误差过大
			u16 Bq_Balan_Fail		: 1; //BQ79616的均衡失败
            u16 RSVD                : 1; //保留
        } Bit;
        u16 Word;
    } Serious_Alarm2;


} _Alarm_RegisterGroup;
extern _Alarm_RegisterGroup Alarm_Reg;
/**@} */

/**
  * @brief  电芯电压、温度最值,以及对应的电芯编码
*/
typedef struct Cell_Maxi_Group
{
    u16 cell_vol_max;
    u8 vol_max_num;
    u16 cell_vol_min;
    u8 vol_min_num;
    u16 cell_tem_max;
    u8 tem_max_num;
    u16 cell_tem_min;
    u8 tem_min_num;
} cell_maxi_reg;
/**@} */

u16 Singel_Protect(s16 *Protect_Cur, s16 load_vol,u16* cell_temper); ///<系统的单点保护，包括pack的过压、欠压，模组过温、低温、均衡，机柜充、放电过流
void Protect_Moudle(cell_maxi_reg *sys_maxi);    ///<电芯保护，电芯过压、欠压
void Protect_Sys_V(void);    					///<总压过压、欠压
void Protect_Sys_I(s16 *Protect_Cur);    ///<电流充、放电过流
void Protect_Sys_T(cell_maxi_reg *sys_maxi); ///<充、放电温度
void Protect_SOH(void);
void Protect_DV_DT(cell_maxi_reg *sys_maxi); ///<温差多大保护，压差过大保护

void Calcu_Total_V(void);    //根据电芯计算总电压

u16 Get_Max_Vol(void);  //查询电芯电压中最大电压值
u16 Get_Min_Vol(void);  //查询电芯电压中最小电压值
u16 Get_Max_Tem(u16 *cell_temper);  //查询电芯温度中最大温度值
u16 Get_Min_Tem(u16 *cell_temper);  //查询电芯温度中最小温度值

#endif
